# 判断基本数据的类型可以使用type函数.
import types


print(type(123)==type(456))
print(type('abc')==str)


# 判断函数的类型使用types模块中的常量
def fn():
    pass
type(fn)==types.FunctionType
type(abs)==types.BuiltinFunctionType
type(lambda x: x)==types.LambdaType
type(x for x in range(1,10))==types.GeneratorType


# 如果是判断类的类型可以使用isinstance()
class Stu():
    def __init__(self,name="jack",age=33):
        self.__name = name
        self.__age = age
    def power():
        pass
        
s = Stu()
b = []
print(isinstance(s,(Stu)))
print(isinstance(b,(Stu)))



# 如果要获得一个对象的所有属性和方法，可以使用dir()函数，它返回一个包含字符串的list，比如，获得一个str对象的所有属性和方法：
print(dir('abc'))

s = "aaa"
# 以下两种方法都是可以的
print(len(s))
print(s.__len__())


# 操作对象的状态，成员和函数等等
stu = Stu()
print(hasattr(stu,'__age')) #false
setattr(stu,'__age',33) # 添加属性
print(hasattr(stu,'__age')) # True
print(getattr(stu,'__age'))
print(getattr(stu,'__name',"无姓名属性")) # 若没有，第三个参数就是默认值
print(hasattr(stu,'power')) # 也可判断函数
